﻿select * from AccountInfo  --个人信息
select * from BankCard  --银行卡信息
select * from CardStateChange  --银行卡状态更改表
select * from CardTransfer  --转账表
select * from CardExchange  --交易记录

--（1）编写一个函数求该银行的金额总和
go
	create function func_GetSumm()
returns @su table(
	CardMoney money
)
as
begin
		insert into @su
		select sum(CardMoney) from BankCard
	return
end
go 
select * from func_GetSumm()


--（2）传入账户编号，返回账户真实姓名
	go
	create function xxx(@accountId int)
returns @info table(
		RealName  varchar(20)
)
as
begin
		insert into @info
		select RealName from AccountInfo  where AccountId = @accountId
		return
	end
go
	select * from xxx(1)



--（3）传递开始时间和结束时间，返回交易记录（存钱取钱），交易记录中包含 真实姓名，卡号，存钱金额，取钱金额，交易时间。

--方案一（逻辑复杂，函数内容除了返回结果的sql语句还有其他内容，例如定义变量等）：
go
	create function jiao(@begin smalldatetime,@end smalldatetime)
	returns @btime table(
		RealName varchar(20),
		CardNo varchar(20),
		MoneyIn money,
		MoneyOut money,
		CardTime smalldatetime
	)
as 
begin 
	insert into @btime
	select na.RealName,na.CardNo,c.MoneyInBank,c.MoneyOutBank,c.ExchangeTime from CardExchange c 
	inner join (	select b.CardNo,a.RealName from AccountInfo a inner join bankcard b on a.AccountId=b.AccountId
		)na on na.CardNo =c.CardNo
		where ExchangeTime>=@begin and ExchangeTime<=@end
	return
	end
	go
	select * from jiao('2022-09-19 18:02:00','2022-09-19 18:05:00')


--（4）查询银行卡信息，将银行卡状态1,2,3,4分别转换为汉字“正常,挂失,冻结,注销”，根据银行卡余额显示银行卡等级 30万以下为“普通用户”,30万及以上为"VIP用户"，分别显示卡号，身份证，姓名，余额，用户等级，银行卡状态。

--方案一：直接在sql语句中使用case when
go
create function mes(@id int)
		returns @message table(
		银行卡状态 varchar(50),
		银行卡等级 varchar(50)
		)as
		begin
		insert into @message
		select
		case CardState
		when 1 then '正常'
		when 2 then '挂失'
		when 3 then '冻结'
		when 4 then '注销'
		end 银行卡状态,
		case 
		when cardmoney>300000 then 'VIP用户'
		else '普通用户'
		end 银行卡等级
		from BankCard where AccountId=@id
		return
		end
go
		select * from mes(3)

--方案二：将等级和状态用函数实现

--（5）编写函数，根据出生日期求年龄，年龄求实岁，例如：

​	--	生日为2000-5-5，当前为2018-5-4，年龄为17岁
​	--	生日为2000-5-5，当前为2018-5-6，年龄为18岁 
go
create function age(@id int)
	returns @age table(
		年龄 int
	)
	as
	begin
	insert into @age
	select 
	case
	when month(GETDATE())>month(OpenTime)
	then YEAR(GETDATE())-YEAR(OpenTime)
	when month(GETDATE())<month(OpenTime)
	then YEAR(GETDATE())-YEAR(OpenTime)-1
		when month(GETDATE())=month(OpenTime) and day(GETDATE())>day(OpenTime)
	then YEAR(GETDATE())-YEAR(OpenTime)
	when month(GETDATE())=month(OpenTime) and day(GETDATE())<day(OpenTime)
	then YEAR(GETDATE())-YEAR(OpenTime)-1
	end 年龄
	from AccountInfo where AccountId=@id
	return
	end
	go
	select * from age(3)